home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / ANTENNA / YAGIU112 / GENETIC.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-10  |  6.1 KB  |  152 lines

  1. #include <stdio.h>
  2. #include <errno.h>
  3. #ifndef DOS
  4. #include <nan.h>
  5. #include <ieeefp.h>
  6. #endif
  7. #include "yagi.h"
  8.  
  9. #define granularity 8 /* 2^granularity = possible different lengths */
  10.  
  11. #define LENGTH_MIN            0.35 /* min length of an element (in lambda) */
  12. #define LENGTH_DR_MIN         0.40 /* min length of an element (in lambda) */
  13. #define LENGTH_MIN_REFLECTOR  0.45 /* min length of reflector (in lambda) */
  14. #define LENGTH_MAX            0.50 /* max length of an element (in lambda) */
  15. #define SPACE_MIN             0.05 /* min spacing between elements(in lambda) */
  16. #define SPACE_MAX             0.42 /* max spacing between elements(in lambda) */
  17. #define MAX_CHANGE
  18. extern int popsize;
  19. extern int iterations;
  20.  
  21. double **data_driveng, **data_parasiticg, *vg, **zg, **Ag, *bg;
  22. double *ping, design_frequencyg;
  23. int driveng, parasiticg, *indxg, elementsg;
  24. struct FCOMPLEX *voltageg, *currentg, *input_impedanceg;
  25. struct element_data *coordinatesg;
  26. double lambda;
  27. struct performance_data *mean_performanceg;
  28. struct flags flagg;
  29. char *output_filenameg, *update_filenameg;
  30. double min_frequencyg, max_frequencyg, step_frequencyg, angular_stepg;
  31. int k;
  32.  
  33. void genetic_algorithm(char *output_filename, char *update_filename, struct flags flag, double design_frequency, double min_frequency, double max_frequency, double step_frequency, double angular_step, int driven, int parasitic, double **data_driven, double **data_parasitic, double *v, double **z, double *pin, struct FCOMPLEX *voltage, struct FCOMPLEX *current, struct FCOMPLEX *input_impedance, struct element_data *coordinates, double **A, double  *b, int *indx,struct performance_data *mean_performance) 
  34. {
  35.     double fitness;
  36.     int elements, i;
  37.     elements=driven+parasitic;
  38.     /* Set up global pointers; save modifiy GA code too much */
  39.     data_driveng=data_driven;
  40.     data_parasiticg=data_parasitic;
  41.     ping=pin; 
  42.     mean_performanceg=mean_performance;
  43.     vg=v;
  44.     zg=z;
  45.     Ag=A;
  46.     bg=b;
  47.     voltageg=voltage;
  48.     currentg=current;
  49.     elementsg=elements;
  50.     input_impedanceg=input_impedance;
  51.     coordinatesg=coordinates;
  52.     indxg=indx;
  53.     driveng=driven;
  54.     flagg=flag;
  55.     parasiticg=parasitic;
  56.     design_frequencyg=design_frequency;
  57.     min_frequencyg=min_frequency;
  58.     max_frequencyg=max_frequency;
  59.     step_frequencyg=step_frequency;
  60.     angular_stepg=angular_step;
  61.     output_filenameg=output_filename;
  62.     update_filenameg=update_filename;
  63.     if(popsize ==0) /* ie  not set by user */
  64.         popsize = 40;
  65.  
  66.     lambda = 3e8/design_frequency;  
  67.     /* Code with an granularity (eg 8) bit string the length in the range 0 to 
  68.     1, wavelength. Multiply by lambda to get true lengths.
  69.  
  70.     Likewise code spacing between individual elements as a 8 bit
  71.     string, then convert to metres by multiplying by lambda */
  72.     Initialise(popsize,2*granularity*elements-granularity);
  73.     SetPrint(0) ;
  74.     for(k=1; k<=iterations; ++k)
  75.     {
  76.         if(k%1==0)
  77.             SetPrint(0) ;
  78.         else
  79.             SetPrint(0);
  80.         end_if_stop_exists(&k,iterations,5);
  81.         Selection(stdout,k) ;
  82.     }
  83.     GA_Free();
  84. }
  85.  
  86. double Objective(char *gene) 
  87. {
  88.         int i;  
  89.         double fitness,lmax;
  90.         static double max_fitness=0;
  91.         static int run_first_time=1;
  92.         if(run_first_time==1)
  93.         {
  94.             max_fitness=get_genetic_algorithm_fitness(flagg, design_frequencyg,driveng,parasiticg,data_driveng, data_parasiticg,vg, zg, ping, voltageg, currentg, input_impedanceg, coordinatesg, Ag, bg, indxg, mean_performanceg);
  95.             do_since_better(0,output_filenameg, update_filenameg, *input_impedanceg,*mean_performanceg, flagg, "Optimised with the genetic algorithm", design_frequencyg, min_frequencyg,max_frequencyg,step_frequencyg, elementsg, driveng, parasiticg,angular_stepg,data_driveng,data_parasiticg,1.0, max_fitness); 
  96.             run_first_time=0;
  97.         } 
  98.         data_parasiticg[1][X]=0.0; /* Set reflector at x=0 */
  99.         /* Find the length of the reflector */
  100.             data_parasiticg[1][LENGTH]=(ss2r(gene,0,granularity)*(LENGTH_MAX-LENGTH_MIN_REFLECTOR)+LENGTH_MIN_REFLECTOR)*lambda;
  101.         for(i=1; i<=driveng; i++) /* for every driven element */
  102.         {
  103.             data_driveng[i][X]=(ss2r(gene,granularity,granularity)*(SPACE_MAX-SPACE_MIN)+SPACE_MIN)*lambda;
  104.             data_driveng[i][LENGTH]=(ss2r(gene,2*granularity,granularity)*(LENGTH_MAX-LENGTH_DR_MIN)+LENGTH_DR_MIN)*lambda; 
  105.  
  106.         }
  107.         /* put directors in + x direction */
  108.         lmax=LENGTH_MAX; /* must be longer than driven */
  109.         /* printf("  dr=%lf lambda = %lf m\n",data_driveng[1][LENGTH],data_driveng[1][LENGTH]*lambda);  */
  110.         for(i=2; i<=parasiticg; i++)
  111.         {
  112.             if(i==2) /* put first director ahead of the driven element */
  113.             data_parasiticg[i][X]=data_driveng[1][X] +(ss2r(gene,granularity*2*i-granularity,granularity)*(SPACE_MAX-SPACE_MIN)+SPACE_MIN)*lambda;  
  114.             else /* These directors must be ahead of the last director */
  115.          data_parasiticg[i][X]=data_parasiticg[i-1][X] +(ss2r(gene,granularity*2*i-granularity,granularity)*(SPACE_MAX-SPACE_MIN)+SPACE_MIN)*lambda;  
  116.             data_parasiticg[i][LENGTH]=(ss2r(gene,granularity*2*i-granularity,granularity)*(lmax-LENGTH_MIN)+LENGTH_MIN)*lambda; 
  117.             /* printf("l=%lf\n",data_parasiticg[i][LENGTH]/lambda);  */
  118.             lmax=data_parasiticg[i][LENGTH]/lambda;
  119.             if(lmax>LENGTH_MAX)
  120.                 lmax=LENGTH_MAX;
  121.         }
  122.         /* printf("\n");     */
  123.         fitness=get_genetic_algorithm_fitness(flagg, design_frequencyg,driveng,parasiticg,data_driveng, data_parasiticg,vg, zg, ping, voltageg, currentg, input_impedanceg, coordinatesg, Ag, bg, indxg, mean_performanceg);
  124.         if(fitness > max_fitness)
  125.         {
  126.             max_fitness=fitness;
  127.             do_since_better(k,output_filenameg, update_filenameg, *input_impedanceg,*mean_performanceg, flagg, "Optimised with the genetic algorithm", design_frequencyg, min_frequencyg,max_frequencyg,step_frequencyg, elementsg, driveng, parasiticg,angular_stepg,data_driveng,data_parasiticg,1.0, fitness); 
  128.         }
  129.  
  130. #ifdef DEBUG
  131.     if(errno)
  132.     {
  133.     fprintf(stderr,"Errno =%d in Objective() of genetic.c\n", errno);
  134.     exit(1);
  135.     }
  136. #endif
  137.         return(fitness);
  138. }
  139.  
  140. double ss2r(char *string,int pos,int len)
  141. {
  142.         double result, x ;
  143.         int loop;
  144.  
  145.         result=0 ;
  146.         for (loop=0 ; loop<len ; loop++) /* XXXXXXXXXXXXXXX */
  147.             result=result+result+string[pos+loop]-'0' ;     
  148.         
  149.         x=(result+1)/((double)(1<<granularity)); 
  150.         return(x);
  151. }
  152.